package org.example.campusforum.controller;

import lombok.extern.slf4j.Slf4j;
import org.example.campusforum.common.Result;
import org.example.campusforum.dto.ArticleGet;
import org.example.campusforum.dto.ArticleGetResponse;
import org.example.campusforum.dto.ArticlePublish;
import org.example.campusforum.service.ArticleGetService;
import org.example.campusforum.service.ArticleService;
import org.example.campusforum.vo.ArticleDetailsReturn;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * 文章控制器
 *
 * 处理文章相关的HTTP请求，包括文章的发布、删除、查询和点赞等功能。
 * 提供RESTful API接口，支持文章的CRUD操作和多种查询方式。
 * 所有接口都需要JWT认证，通过拦截器验证用户身份。
 *
 * @author CampusForum Team
 * @version 1.0
 * @since 2024
 */
@RestController
@RequestMapping("/api/user/article")
@Slf4j
public class ArticleController {

    /**
     * 文章服务层，处理文章相关业务逻辑
     */
    @Autowired
    private ArticleService articleService;

    /**
     * 文章查询服务层，处理文章查询相关业务逻辑
     */
    @Autowired
    ArticleGetService articleGetService;

    /**
     * 发布文章
     *
     * 接收用户发布文章的请求，创建新的文章记录。
     * 用户ID从JWT令牌中自动获取，文章状态默认设置为审核通过。
     *
     * @param articlePublish 文章发布信息，包含标题、内容和分类ID
     * @return 统一响应结果，成功时返回success
     */
    @PostMapping()
    public Result save(@RequestBody ArticlePublish articlePublish) {
        log.info("新增文章：{}", articlePublish);

        articleService.save(articlePublish);

        return Result.success();
    }

    /**
     * 根据ID删除文章
     *
     * 执行文章的逻辑删除操作，将文章标记为已删除状态。
     * 只有文章作者或管理员才能删除文章。
     *
     * @param id 要删除的文章ID
     * @return 统一响应结果，成功时返回success
     */
    @DeleteMapping("/{id}")
    public Result deleteById(@PathVariable Long id) {
        log.info("删除文章，id为：{}", id);

        articleService.deleteById(id);

        return Result.success();
    }

    /**
     * 查询文章列表
     *
     * 根据不同的查询条件返回文章列表，支持多种查询方式：
     * 1. 按用户ID查询：查询指定用户发布的文章
     * 2. 按标题查询：模糊搜索文章标题
     * 3. 按分类查询：查询指定分类下的文章
     * 4. 组合查询：标题+分类的组合查询
     * 支持分页和多种排序方式。
     *
     * @param articleGet 文章查询条件，包含分页、排序、筛选等参数
     * @return 包含文章列表和总数的查询结果
     */
    @RequestMapping("query")
    public Result articleGet(@RequestBody ArticleGet articleGet) {
        log.info("查询文章列表：{}", articleGet);

        // 按用户ID查询文章
        if (articleGet.getId() != 0) {
            ArticleGetResponse articleResponse = articleGetService.getArticleByUserId(articleGet);
            log.info("按用户ID查询结果：{}", articleResponse);
            return Result.success(articleResponse);
        }
        // 按标题查询文章
        else if (articleGet.getTitle() != null) {
            // 仅按标题查询
            if (articleGet.getCategoryId() == null) {
                ArticleGetResponse articleResponse = articleGetService.getArticleByTitle(articleGet);
                log.info("按标题查询结果：{}", articleResponse);
                return Result.success(articleResponse);
            }
            // 标题+分类组合查询
            else {
                ArticleGetResponse articleResponse = articleGetService.getArticleByTitleAndCategoryId(articleGet);
                log.info("按标题和分类查询结果：{}", articleResponse);
                return Result.success(articleResponse);
            }
        }
        // 按分类ID查询文章
        else if (articleGet.getCategoryId() != null) {
            ArticleGetResponse articleResponse = articleGetService.getArticleByCategoryId(articleGet);
            log.info("按分类查询结果：{}", articleResponse);
            return Result.success(articleResponse);
        }
        // 缺少查询条件
        else {
            return Result.error("缺少查询条件，请提供用户ID、标题或分类ID");
        }
    }

    /**
     * 获取文章详情
     *
     * 根据文章ID查询文章的完整信息，包括文章内容、作者信息、
     * 图片列表和评论列表等。同时会增加文章的浏览量。
     *
     * @param id 文章ID，通过路径变量传递
     * @return 包含文章详细信息的响应结果
     */
    @GetMapping("ArticleDetails/{id}")
    public Result ArticleDetails(@PathVariable Long id) {
        log.info("获取文章详情，文章ID：{}", id);

        ArticleDetailsReturn article = articleService.getArticleDetails(id);

        if (article == null) {
            return Result.error("文章不存在或已被删除");
        }
        return Result.success(article);
    }

    /**
     * 文章点赞/取消点赞
     *
     * 对指定文章进行点赞操作。如果用户已点赞则取消点赞，
     * 如果未点赞则添加点赞记录。用户ID从JWT令牌中自动获取。
     *
     * @param id 文章ID，通过请求体传递
     * @return 点赞操作结果，成功返回success
     */
    @PostMapping("like")
    public Result like(@RequestBody Long id) {
        log.info("文章点赞操作，文章ID：{}", id);

        int row = articleService.like(id);
        return row == 1 ? Result.success("操作成功") : Result.error("操作失败");
    }

}
